package utils

import (
	"bytes"
	"context"
	"crypto/tls"
	"encoding/json"
	"fmt"
	"github.com/sirupsen/logrus"
	"io"
	"net/http"
	"net/url"
	"time"
)

// SendRequest 发送POST请求
func SendRequest(tencentUrl, method string, data map[string]interface{}, cookies string, copyAccountTxLogger *logrus.Logger, result interface{}) error {
	parsedURL, err := url.Parse(tencentUrl)
	if err != nil {
		return fmt.Errorf("解析URL失败: %v", err)
	}

	var req *http.Request

	// 处理请求方法（GET/POST）
	if method == "GET" {
		// GET: 将data作为查询参数
		q := parsedURL.Query()
		for k, v := range data {
			q.Set(k, fmt.Sprintf("%v", v))
		}
		parsedURL.RawQuery = q.Encode()
		req, err = http.NewRequest(method, parsedURL.String(), nil)
	} else {
		// POST/PUT/其他方法: 将data编码为JSON
		body, err := json.Marshal(data)
		if err != nil {
			return fmt.Errorf("数据编码失败: %v", err)
		}
		req, err = http.NewRequest(method, parsedURL.String(), bytes.NewBuffer(body))
		req.Header.Set("Content-Type", "application/json")
	}

	if err != nil {
		return fmt.Errorf("创建请求失败: %v", err)
	}

	// 设置Cookie头（如果存在）
	if cookies != "" {
		req.Header.Set("Cookie", cookies)
	}

	// 禁用SSL验证（模拟 CURLOPT_SSL_VERIFYPEER = false）
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 禁用SSL验证
	}
	client := &http.Client{Transport: tr}

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("读取响应失败: %v", err)
	}

	// 检查HTTP状态码
	if resp.StatusCode < 200 || resp.StatusCode > 299 {
		return fmt.Errorf("HTTP请求失败: %s, 响应: %s", resp.Status, body)
	}

	copyAccountTxLogger.Infof("腾讯响应: %s", body)

	// 解析JSON响应（如果需要）
	if result != nil {
		if err := json.Unmarshal(body, result); err != nil {
			return fmt.Errorf("解析响应失败: %v, 响应: %s", err, body)
		}
	}

	return nil
}

// SendRequestWithContext 发送消息的 request
func SendRequestWithContext(ctx context.Context, urlStr, method string, data interface{}, headers map[string]string, result interface{}) error {
	parsedURL, err := url.Parse(urlStr)
	if err != nil {
		return fmt.Errorf("解析URL失败: %v", err)
	}

	if method == "GET" && data != nil {
		values := parsedURL.Query()
		switch d := data.(type) {
		case map[string]interface{}:
			for k, v := range d {
				values.Set(k, fmt.Sprintf("%v", v))
			}
		default:
			return fmt.Errorf("GET 方法参数必须为 map[string]interface{}")
		}
		parsedURL.RawQuery = values.Encode()
		urlStr = parsedURL.String()
	}

	var reqBody io.Reader
	if method == "POST" {
		body, err := json.Marshal(data)
		if err != nil {
			return fmt.Errorf("JSON编码失败: %v", err)
		}
		reqBody = bytes.NewBuffer(body)
	}

	req, err := http.NewRequestWithContext(ctx, method, urlStr, reqBody)
	if err != nil {
		return fmt.Errorf("创建请求失败: %v", err)
	}

	for k, v := range headers {
		req.Header.Set(k, v)
	}
	if method == "POST" {
		req.Header.Set("Content-Type", "application/json")
	}

	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		},
		Timeout: 30 * time.Second,
	}

	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	respBody, err := io.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("读取响应失败: %v", err)
	}

	if result != nil {
		if err := json.Unmarshal(respBody, result); err != nil {
			return fmt.Errorf("JSON解析失败: %v", err)
		}
	}

	return nil
}
